from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime
import importlib
import logging
from utils.read_config import read_config

def job():
    print(f"任务正在运行{datetime.now()}",flush=True)


scheduler = BackgroundScheduler()
def scheduled_tasks(in_method_name):
    configs=read_config("cron","job")
    for config in configs:
        try:
            method_name=config['method_name']
            if method_name==in_method_name:
                file_name=config['file_name']
                cron=config['cron']
                second=cron.split()[0]
                minute=cron.split()[1]
                hour=cron.split()[2]
                day=cron.split()[3]
                month=cron.split()[4]
                day_of_week=cron.split()[5]
                if file_name:
                    module = importlib.import_module(file_name)#其他文件方法
                    method = getattr(module, method_name, None)
                else:
                    method = globals().get(method_name)#本文件方法
                if not method:
                    logging.info(f"方法 {method_name} 未找到")
                    return
                # max_instances:同一任务有多个实例同时运行,misfire_grace_time:允许任务在错过触发时间后的一段时间内执行
                #coalesce=True表示如果任务错过了多个触发时间，只会执行一次
                scheduler.add_job(method, 'cron', second=second,minute=minute, hour=hour, day=day, month=month, day_of_week=day_of_week, max_instances=1,misfire_grace_time=60,coalesce=True)
                logging.info(f"方法 {method_name} 已启动")
                break
        except Exception as e:
            logging.info(f"{e}")
            return  # 或者直接退出程序，例如使用 sys.exit()   
         
    if not scheduler.running:    
        scheduler.start()

def scheduler_remove(name):
    jobs = scheduler.get_jobs()
    for job in jobs:
        if job.name == name:
            scheduler.remove_job(job.id)
            logging.info(f"方法 {name} 已停止")
            break;

def scheduler_dropAll():
    scheduler.shutdown()
    logging.info(f"自动任务已经全部停止")

if __name__=='__main__':
    scheduled_tasks('tasks')